package kr.pe.johnkim.sendme.util;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import kr.pe.johnkim.sendme.provider.SendMeFriend;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.util.Log;

/**
 * 공통으로 사용하는 메소드를 구현하는 클래스 이다.
 * 
 * @author johnkim
 *
 */
public class SendMeCommon {

	public static String TAG = SendMeCommon.class.getSimpleName();
	
	// String <-> String[] 변환용
    String strSeparator = "/";
	
	/**
	 * 현재 날짜와 시간을 2010-10-22 15:20:46 포멧의 string 으로 반환한다.
	 * 
	 * @return
	 */
	@SuppressLint("SimpleDateFormat")
	public String getCurrentDate() {
		Log.i(TAG, "getCurrentDate");

		Date date = new Date();
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

		return simpleDateFormat.format(date);
	}
	
	
	/**
	 * sqlite 에 넣고 빼거나 할때 배열과 문자열 간 변환을 위해 사용
	 */
  	/*
  	 * String[] -> String
  	 * 
  	 */
  	public String convertArrayToString(String[] array) {
  		String str = "";
  		for(int i=0; i<array.length; i++) {
  			str= str + array[i];
  			if(i<array.length-1){
  				str = str + strSeparator;
  			}
  		}
  		return str;
  	}
  	/*
  	 * String -> String[]
  	 */
   public String[] convertStringToArray(String str) {
	  String[] arr = str.split(strSeparator);
	  return arr;
  }
   
   /**
    * 전번 출력시 - 를 넣어서 출력
    * @param phoneNumberOrg
    * @return
    */
   public String phoneNumberForShowFormat(String phoneNumberOrg){
	   String returnPhoneNumber = "";
	   
	   if(phoneNumberOrg.length()==10){
		   returnPhoneNumber = phoneNumberOrg.substring(0, 3) + "-" + phoneNumberOrg.substring(3,6) + "-" + phoneNumberOrg.substring(6);		// (7번째 이후)
	   }else if(phoneNumberOrg.length()==11){
		   returnPhoneNumber = phoneNumberOrg.substring(0, 3) + "-" + phoneNumberOrg.substring(3,7) + "-" + phoneNumberOrg.substring(7);		// (8번째 이후)
	   }else{
		   returnPhoneNumber = phoneNumberOrg;
	   }
	   return returnPhoneNumber;
   }
   
   /**
    * 전번
    */
	// 전화번호부에 있는 전화번호 리스트 받아오기

	public ArrayList<SendMeFriend> selectPhoneBookAddress(Context context){

		ArrayList<SendMeFriend> sendMeFriends = new ArrayList<SendMeFriend>();

		Uri ContactsUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;

		//타입은 이 전화번호가 집번호인지 핸드폰번호인지 기타번호인지를 파악해주기 위한 column이다.
		String disName = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME;
		String number = ContactsContract.CommonDataKinds.Phone.NUMBER;
		String type = ContactsContract.CommonDataKinds.Phone.TYPE;

		// 주소록을 가져오기 위한 쿼리문을 날리고 커서를 리턴 받는다.
		Cursor cursor = context.getContentResolver().query(ContactsUri, new String[]{disName, number, type}, null, null, disName);

		//	Cursor에서 값을 받는다
		if(cursor != null){
			SendMeCommon sendMeCommon = new SendMeCommon();
			String nowTime = sendMeCommon.getCurrentDate();
			cursor.moveToFirst();
			while(!cursor.isAfterLast()){	
				String name = cursor.getString(0);
				String phone = cursor.getString(1);
				String phoneType = cursor.getString(2);
				if(phone.contains("+821")){
					phone = phone.replace("+821", "01");	
				}
				phone = phone.replace("-", "");	
				// 01 로시작하는 번호만.
				if(phone.startsWith("01") && phoneType.equals(Integer.toString(ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE))){		// 휴대전화 번호 타입

					SendMeFriend sendMeFriend = new SendMeFriend();

					sendMeFriend.setName(name);
					sendMeFriend.setPhoneNumber(phone);
					sendMeFriends.add(sendMeFriend);
				}

				cursor.moveToNext();
			}
			cursor.close();
			Log.d(TAG,"sendMeFriends::"+sendMeFriends.size());
		}
		return sendMeFriends;
	}
	
	/**
	 * 전화번호 조회
	 *   번호를 넣으면 이름을 반환
	 *    닉네임 있으면 닉네임 반환해야.
	 */
	public String selectFriendNameByPhoneNumber(Context context, String phoneNumber){
		
		if(phoneNumber.contains("+821")){
			phoneNumber = phoneNumber.replace("+821", "01");
		}
		phoneNumber = phoneNumber.replace("-", "");	
		
		// 닉네임 구하기
//		SendMeDBManagerInstallUser sendMeDBManagerInstallUser = new SendMeDBManagerInstallUser(context);
//		ArrayList<SendMeFriend> phoneBookAddress = sendMeDBManagerInstallUser.selectInstallUserData();
//		for(int i=0; i<phoneBookAddress.size(); i++){
//			SendMeFriend sendMeFriend = phoneBookAddress.get(i);
//			
//			if(sendMeFriend.getPhoneNumber().equals(phoneNumber)){
//				if(phoneBookAddress.get(i).getNickName().length()>0){
//					return phoneBookAddress.get(i).getNickName();
//				}else{
//					return phoneBookAddress.get(i).getName();
//				}
//			}
//		}
		
		// 전화번호부에 저장되어 있는 전화번호 목록
		ArrayList<SendMeFriend> phoneBookFriendList = null;
		/*
		 *  디바이스에 저장된 전번 목록
		 */
		Uri ContactsUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
		
		//타입은 이 전화번호가 집번호인지 핸드폰번호인지 기타번호인지를 파악해주기 위한 column이다.
		String number = ContactsContract.CommonDataKinds.Phone.NUMBER;
		String type = ContactsContract.CommonDataKinds.Phone.TYPE;
		String name = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME;
		// 주소록을 가져오기 위한 쿼리문을 날리고 커서를 리턴 받는다.
		Cursor cursor = context.getContentResolver().query(ContactsUri, new String[]{number, type, name}, null, null, name);
		
		//	Cursor에서 값을 받는다
		if(cursor != null) {		
			phoneBookFriendList = new ArrayList<SendMeFriend>();
			
			cursor.moveToFirst();
			while(!cursor.isAfterLast()){	
				
				String phone = cursor.getString(0);
				String phoneType = cursor.getString(1);
				String displayName = cursor.getString(2);
				
				if(phone.contains("+821")){
					phone = phone.replace("+821", "01");
				}
				phone = phone.replace("-", "");	
				
				if(phoneType.equals(Integer.toString(ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE))){		// 휴대전화 번호 타입
					SendMeFriend sendMeFriend = new SendMeFriend();
					sendMeFriend.setPhoneNumber(phone);
					sendMeFriend.setName(displayName);
					phoneBookFriendList.add(sendMeFriend);
				}
								
				cursor.moveToNext();
			}
			cursor.close();
		}
		
		for(int i=0; i<phoneBookFriendList.size(); i++) {
			SendMeFriend sendMeFriend = phoneBookFriendList.get(i);
			
			if(sendMeFriend.getPhoneNumber().equals(phoneNumber)) {	// 같을 경우 
				return sendMeFriend.getName();
			}
		}
		
		// 못찾으면 그냥 전번 사용
		return phoneNumber;
	}
   
	
	
	
	/*
	 * 뱃지 관련 
	 *   어플 아이콘에 뱃지 달기(카운터)
	 *   삼성 폰만 지원됨
	 */
	/**
	 * 프리퍼런스에 뱃지 카운트 값을 저장한다
	 */
	public void badgeCountPrefSave(Context context, int badgeCount){
		Log.d(TAG,"prefBadgeCountSave");
		SharedPreferences sharedPreferences = context.getSharedPreferences(SendMeConstant.SENDME_PREFERENCE, Activity.MODE_PRIVATE);
		SharedPreferences.Editor editor = sharedPreferences.edit();
		editor.putInt("badge_count", badgeCount);
		editor.commit();
	}
	/**
	 * 프리퍼런스에 뱃지 카운트 값을 로드한다
	 */
	public int badgeCountPrefLoad(Context context){
		Log.d(TAG,"prefBadgeCountLoad");
		int badgeCount = 0;
		SharedPreferences mSharedPreference = context.getSharedPreferences(SendMeConstant.SENDME_PREFERENCE, Activity.MODE_PRIVATE);
		badgeCount = mSharedPreference.getInt("badge_count", 0);
		return badgeCount;
	}
	
	/**
	 * 어플에 뱃지 카운트를 초기화한다
	 */
	public void badgeCountInit(Context context){
		try{
			 /*
			  * init
			  */
			context.getContentResolver().delete(Uri.parse("content://com.sec.badge/apps"), "package=?", new String[]{context.getPackageName()});
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	/**
	 * 어플에 뱃지 카운트를 설정한다
	 */
	public void badgeCountSet(Context context, int badgeCount){
		try{
			/*
			 * insert
			 */
			ContentValues cv = new ContentValues();
			cv.put("package", context.getPackageName());
			// Name of your activity declared in the manifest as android.intent.action.MAIN.
			// Must be fully qualified name as shown below
			cv.put("class", "kr.pe.johnkim.sendme.activity.SendMeLauncherActivity");
			cv.put("badgecount", badgeCount); // integer count you want to display
			// Execute insert
			context.getContentResolver().insert(Uri.parse("content://com.sec.badge/apps"), cv);
			
//			/*
//			 * 조회
//			 */
//			Uri uri = Uri.parse("content://com.sec.badge/apps");		
//			Cursor c = context.getContentResolver().query(uri, null, null, null, null);
//			if (c == null) {
//			    return;
//			}
//			try {
//			    if (!c.moveToFirst()) {
//			        // No results. Nothing to query
//			        return;
//			    }
//			    c.moveToPosition(-1);
//			    while (c.moveToNext()) {
//			        String pkg = c.getString(1);
//			        String clazz = c.getString(2);
//			        int count = c.getInt(3);
//			        Log.d("BadgeTest", "package: " + pkg + ", class: " + clazz + ", count: " + String.valueOf(count));
//			    }
//			} finally {
//			    c.close();
//			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	/**
	 * 어플에 뱃지 카운트를 설정한다. 
	 *  (초기화+세팅)
	 *   메시지 설정을 따른다.
	 */
	public void badgeCountAutoSet(Context context){
		try{
			// 현재 뱃지 정보를 초기화
			context.getContentResolver().delete(Uri.parse("content://com.sec.badge/apps"), "package=?", new String[]{context.getPackageName()});
			
			// 설정을 가져옴. 뱃지 카운트, 사용 여부
			SharedPreferences mSharedPreference = context.getSharedPreferences(SendMeConstant.SENDME_PREFERENCE, Activity.MODE_PRIVATE);
			int badgeCount = mSharedPreference.getInt("badge_count", 0);
			boolean isToggleButtonMessagePopUpOn  = mSharedPreference.getBoolean("setting_message_popup_on", true);

			//  세팅함  
			if(badgeCount>0 && isToggleButtonMessagePopUpOn){
				badgeCountSet(context, badgeCount);
			}else{
				badgeCountSet(context, 0);		// 0으로 설정하여 삭제하지 않으면 기존 뱃지가 유지
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
}
